package servlets;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import beans.AtuacaoProfissional;
import beans.Endereco;
import beans.FormacaoAcademica;
import beans.FormacaoComplementar;
import beans.Informacoes;
import beans.ProducaoBibliografica;
import beans.Usuario;


public class CadastroCurriculoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
    public CadastroCurriculoServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processaCurriculo(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processaCurriculo(request, response);
	}
	
	
	public void processaCurriculo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		boolean formAcamVazio = true;
		boolean formCompVazio = true;
		boolean atuaProfVazio = true;
		boolean prodBiblVazio = true;
		
		request.setCharacterEncoding("UTF-8");
		
		/*Identificacao*/
		Informacoes informacoes = new Informacoes();
		
		informacoes.setNome(request.getParameter("nome"));
		informacoes.setNomeCitacoes(request.getParameter("nomeCitacoes"));
		informacoes.setNacionalidade(request.getParameter("nacionalidade"));
		informacoes.setCpf(request.getParameter("cpf"));
		informacoes.setEstadoCivil(request.getParameter("estadoCivil"));
		informacoes.setTipoSexo(request.getParameter("tipoSexo"));
		informacoes.setEmail(request.getParameter("email"));
		informacoes.setEstadoNascimento(request.getParameter("estadoNascimento"));
		informacoes.setCidadeNascimento(request.getParameter("cidadeNascimento"));
		informacoes.setDataNascimento(request.getParameter("dataNascimento"));
		informacoes.setRg(request.getParameter("rg"));
		informacoes.setOrgaoEmissor(request.getParameter("orgaoEmissor"));
		informacoes.setEstadoIdentidade(request.getParameter("estadoIdentidade"));
		informacoes.setDataEmissao(request.getParameter("dataEmissao"));
		informacoes.setPaisEmissao(request.getParameter("paisEmissao"));
		informacoes.setNomePai(request.getParameter("nomePai"));
		informacoes.setNomeMae(request.getParameter("nomeMae"));
		
		/*Endereco*/		
		Endereco endereco = new Endereco();
		
		endereco.setLogradouroRes(request.getParameter("logradouroRes"));
		endereco.setBairroRes(request.getParameter("bairroRes"));
		endereco.setComplementoRes(request.getParameter("complementoRes"));
		endereco.setCepRes(request.getParameter("cepRes"));
		endereco.setCidadeRes(request.getParameter("cidadeRes"));
		endereco.setEstadoRes(request.getParameter("estadoRes"));
		endereco.setTefefoneRes(request.getParameter("tefefoneRes"));
		endereco.setCelularRes(request.getParameter("celularRes"));
		endereco.setHomePageRes(request.getParameter("homePageRes"));
		endereco.setEmailPublico(request.getParameter("emailPublico"));
		
		/*Formacao Academica*/
		String[] nivel  = request.getParameterValues("nivel");
		String[] curso  = request.getParameterValues("curso");
		String[] instituicao  = request.getParameterValues("instituicao");
		String statusCurso;
		String[] dataInicio  = request.getParameterValues("dataInicio");
		String[] dataConclusao  = request.getParameterValues("dataConclusao");
		String[] duracao  = request.getParameterValues("duracao");
		
		List <FormacaoAcademica> formAcadLista = new ArrayList<FormacaoAcademica>();
		
		if(nivel != null){
			formAcamVazio = false;
			
			for(int i = 0; i < nivel.length; i++){
				FormacaoAcademica formAcad = new FormacaoAcademica();
				
				formAcad.setNivel(nivel[i]);
				formAcad.setCurso(curso[i]);
				formAcad.setInstituicao(instituicao[i]);
				statusCurso = request.getParameter("statusCurso"+(i+1));
				
				
				formAcad.setStatusCurso(statusCurso);
				formAcad.setDataInicio(dataInicio[i]);
				formAcad.setDataConclusao(dataConclusao[i]);
				formAcad.setDuracao(duracao[i]);
				
				formAcadLista.add(formAcad);
			}
		}
		
		/*Formacao Complementar*/		
		String[] nivelFormCompl  = request.getParameterValues("nivelFormCompl");
		String[] cursoFormCompl  = request.getParameterValues("cursoFormCompl");
		String[] instituicaoFormCompl  = request.getParameterValues("instituicaoFormCompl");
		String statusCursoFormCompl;
		String[] dataInicioFormCompl  = request.getParameterValues("dataInicioFormCompl");
		String[] dataConclusaoFormCompl  = request.getParameterValues("dataConclusaoFormCompl");
		String[] duracaoFormCompl  = request.getParameterValues("duracaoFormCompl");
		
		List<FormacaoComplementar> formCompLista = new ArrayList<FormacaoComplementar>();
		
		if(nivelFormCompl != null){
			formCompVazio = false;
			
			for(int i = 0; i < nivelFormCompl.length; i++){
				FormacaoComplementar formComp = new FormacaoComplementar();
				
				formComp.setNivelFormCompl(nivelFormCompl[i]);
				formComp.setCursoFormCompl(cursoFormCompl[i]);
				formComp.setInstituicaoFormCompl(instituicaoFormCompl[i]);
				statusCursoFormCompl = request.getParameter("statusCursoFormCompl"+(i+1));
				formComp.setStatusCursoFormCompl(statusCursoFormCompl);
				formComp.setDataInicioFormCompl(dataInicioFormCompl[i]);
				formComp.setDataConclusaoFormCompl(dataConclusaoFormCompl[i]);
				formComp.setDuracaoFormCompl(duracaoFormCompl[i]);
				
				formCompLista.add(formComp);
			}
		}
		
		/*Atuação Profissional*/
		
		String[] nomeInstituicao  = request.getParameterValues("nomeInstituicao");
		String[] tipoVinculo  = request.getParameterValues("tipoVinculo");
		String[] enqProfissional  = request.getParameterValues("enqProfissional");		  
		String[] dataInicioAtProf  = request.getParameterValues("dataInicioAtProf");
		String[] dataConclusaoAtProf  = request.getParameterValues("dataConclusaoAtProf");
		
		List<AtuacaoProfissional> atuaProfLista = new ArrayList<AtuacaoProfissional>();
		
		if(tipoVinculo != null){
			atuaProfVazio = false;
			
			for( int i = 0; i < tipoVinculo.length; i++){
				AtuacaoProfissional atuaProf = new AtuacaoProfissional();
				
				atuaProf.setNomeInstituicao(nomeInstituicao[i]);
				atuaProf.setTipoVinculo(tipoVinculo[i]);
				atuaProf.setEnqProfissional(enqProfissional[i]);
				atuaProf.setDataInicioAtProf(dataInicioAtProf[i]);
				atuaProf.setDataConclusaoAtProf(dataConclusaoAtProf[i]);
				
				atuaProfLista.add(atuaProf);
			}
		}
		
		/*Produção Bibliográfica*/
		String[] tipoProducao  = request.getParameterValues("tipoProducao");
		
		List<ProducaoBibliografica> prodBiblioLista = new ArrayList<ProducaoBibliografica>();
		
		if(tipoProducao != null){
		
			prodBiblVazio = false;
			int j = 0;
			int k = 0;
			int l = 0;
			
			for( int i = 0; i < tipoProducao.length; i++){
				
				ProducaoBibliografica prodBiblio = new ProducaoBibliografica();
				
				
				if(tipoProducao[i].equals("Artigo Completo")){
					
					
					String[] issnPeriodico  = request.getParameterValues("issnPeriodico");
					String[] nomePeriodico  = request.getParameterValues("nomePeriodico");
					String[] volPeriodico  = request.getParameterValues("volPeriodico");
					String[] edicaoPeriodico  = request.getParameterValues("edicaoPeriodico");
					String[] pgInicialPeriodico  = request.getParameterValues("pgInicialPeriodico");
					String[] doiPeriodico  = request.getParameterValues("doiPeriodico");
					String[] tituloPeriodico  = request.getParameterValues("tituloPeriodico");
					String[] anoPeriodico  = request.getParameterValues("anoPeriodico");
					String[] idiomaPeriodico  = request.getParameterValues("idiomaPeriodico");
					String[] meioDivulgacaoPeriodico  = request.getParameterValues("meioDivulgacaoPeriodico");
					String[] homePagePeriodico  = request.getParameterValues("homePagePeriodico");
					String[] autorPeriodico  = request.getParameterValues("autorPeriodico");
					
					
					prodBiblio.setTipoProducao(tipoProducao[i]);
					prodBiblio.setIssnPeriodico(issnPeriodico[j]);
					prodBiblio.setNomePeriodico(nomePeriodico[j]);
					prodBiblio.setVolPeriodico(volPeriodico[j]);
					prodBiblio.setEdicaoPeriodico(edicaoPeriodico[j]);
					prodBiblio.setPgInicialPeriodico(pgInicialPeriodico[j]);
					prodBiblio.setDoiPeriodico(doiPeriodico[j]);
					prodBiblio.setTituloPeriodico(tituloPeriodico[j]);
					prodBiblio.setAnoPeriodico(anoPeriodico[j]);
					prodBiblio.setIdiomaPeriodico(idiomaPeriodico[j]);
					prodBiblio.setMeioDivulgacaoPeriodico(meioDivulgacaoPeriodico[j]);
					prodBiblio.setHomePagePeriodico(homePagePeriodico[j]);
					prodBiblio.setAutorPeriodico(autorPeriodico[j]);
					
					prodBiblioLista.add(prodBiblio);
					
					j++;
					
				}
				else if(tipoProducao[i].equals("Livro ou Capítulo de Livro")){
					
					String[] tipoProducaoLivro  = request.getParameterValues("tipoProducaoLivro");
					String[] issnLivro  = request.getParameterValues("issnLivro");
					String[] anoLivro  = request.getParameterValues("anoLivro");
					String[] autorEditorLivro  = request.getParameterValues("autorEditorLivro");			      
					String[] doiLivro  = request.getParameterValues("doiLivro");
					String[] tipoLivro  = request.getParameterValues("tipoLivro");
					String[] naturezaLivro  = request.getParameterValues("naturezaLivro");			      
					String[] tituloLivro  = request.getParameterValues("tituloLivro");
					String[] anoDoLivro  = request.getParameterValues("anoDoLivro");
					String[] paisLivro = request.getParameterValues("paisLivro");
					String[] idiomaLivro  = request.getParameterValues("idiomaLivro");
					String[] meioDivulgacaoLivro  = request.getParameterValues("meioDivulgacaoLivro");
					String[] homePageLivro  = request.getParameterValues("homePageLivro");
					String[] autorLivro  = request.getParameterValues("autorLivro");
					
					
					
					prodBiblio.setTipoProducao(tipoProducao[i]);
					prodBiblio.setTipoProducaoLivro(tipoProducaoLivro[k]);
					prodBiblio.setIssnLivro(issnLivro[k]);
					prodBiblio.setAnoLivro(anoLivro[k]);
					prodBiblio.setAutorEditorLivro(autorEditorLivro[k]);
					prodBiblio.setDoiLivro(doiLivro[k]);
					prodBiblio.setTipoLivro(tipoLivro[k]);
					prodBiblio.setNaturezaLivro(naturezaLivro[k]);
					prodBiblio.setTituloLivro(tituloLivro[k]);
					prodBiblio.setAnoDoLivro(anoDoLivro[k]);
					prodBiblio.setPaisLivro(paisLivro[k]);
					prodBiblio.setIdiomaLivro(idiomaLivro[k]);
					prodBiblio.setMeioDivulgacaoLivro(meioDivulgacaoLivro[k]);
					prodBiblio.setHomePageLivro(homePageLivro[k]);
					prodBiblio.setAutorLivro(autorLivro[k]);
					
					prodBiblioLista.add(prodBiblio);
					
					k++;
					
				}
				else {
					
					String[] tipoResumo  = request.getParameterValues("tipoResumo");			     ;			      
					String[] tituloResumo  = request.getParameterValues("tituloResumo");			      
					String[] anoResumo  = request.getParameterValues("anoResumo");			      
					String[] paisResumo = request.getParameterValues("paisResumo");			      
					String[] idiomaResumo  = request.getParameterValues("idiomaResumo");			      
					String[] meioDivulgacaoResumo  = request.getParameterValues("meioDivulgacaoResumo");			      
					String[] homePageResumo  = request.getParameterValues("homePageResumo");	
					
					
					
					prodBiblio.setTipoProducao(tipoProducao[i]);
					prodBiblio.setTipoResumo(tipoResumo[l]);
					prodBiblio.setTituloResumo(tituloResumo[l]);
					prodBiblio.setAnoResumo(anoResumo[l]);
					prodBiblio.setPaisResumo(paisResumo[l]);
					prodBiblio.setIdiomaResumo(idiomaResumo[l]);
					prodBiblio.setMeioDivulgacaoResumo(meioDivulgacaoResumo[l]);
					prodBiblio.setHomePageResumo(homePageResumo[l]);
					
					prodBiblioLista.add(prodBiblio);
					
					l++;
				}
				
			}
		}
		
		HttpSession session = request.getSession();
				
		Usuario usuario = (Usuario)session.getAttribute("usuario");
		/* Atualizando campos de busca do usuário */
		usuario.setNome(request.getParameter("nome"));
		usuario.setNomeCitacoes(request.getParameter("nomeCitacoes"));
		
		session.removeAttribute("usuario");
		session.setAttribute("usuario", usuario);
		
		/* Atualiza o bean usuário em disco com nome e nome em citações */
		ArrayList<Usuario> listaDeUsuarios = null;
		try {
			
			FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/bancodados/login.obj"));
			ObjectInputStream ois = new ObjectInputStream(fis);
			listaDeUsuarios = (ArrayList<Usuario>) ois.readObject();
			ois.close();
			for (Usuario u : listaDeUsuarios) {
				if(u.getEmail().equals(usuario.getEmail())){
					u.setNome(request.getParameter("nome"));
					u.setNomeCitacoes(request.getParameter("nomeCitacoes"));
					break;
				}				
			}			
		} catch (Exception e) {			
		}
		
		try{
			FileOutputStream fos = new FileOutputStream(getServletContext().getRealPath("/bancodados/login.obj"));
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(listaDeUsuarios);
			oos.close();
		} catch (Exception e){
			e.printStackTrace();
		}
		
		String path = getServletContext().getRealPath("/bancodados/"+usuario.getEmail());
		try{
			
			/*Salva informacoes*/
			FileOutputStream fos = new FileOutputStream(path+"_"+"informacoes.obj");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(informacoes);
			oos.close();
			session.removeAttribute("informacoes");
			session.setAttribute("informacoes", informacoes);
			
			/*Salva endereco*/
			fos = new FileOutputStream(path+"_"+"endereco.obj");
			oos = new ObjectOutputStream(fos);
			oos.writeObject(endereco);
			oos.close();
			session.removeAttribute("endereco");
			session.setAttribute("endereco", endereco);
			
			/*Salva Formações academicas*/
			if(!formAcamVazio){
				fos = new FileOutputStream(path+"_"+"formacao_academica.obj");
				oos = new ObjectOutputStream(fos);
				oos.writeObject(formAcadLista);
				oos.close();
				session.removeAttribute("formAcadLista");
				session.setAttribute("formAcadLista", formAcadLista);
			}else{
				File apagarArquivo = new File(path+"_"+"formacao_academica.obj");
		        if(apagarArquivo.exists()){  
		            apagarArquivo.delete();  
		        }  
		        session.removeAttribute("formAcadLista");
			}
			
			/*Salva Formações complementares*/
			if(!formCompVazio){
				fos = new FileOutputStream(path+"_"+"formacao_complementar.obj");
				oos = new ObjectOutputStream(fos);
				oos.writeObject(formCompLista);
				oos.close();
				session.removeAttribute("formCompLista");
				session.setAttribute("formCompLista", formCompLista);
			}else{
				File apagarArquivo = new File(path+"_"+"formacao_complementar.obj");
		        if(apagarArquivo.exists()){  
		            apagarArquivo.delete();  
		        }  
		        session.removeAttribute("formCompLista");
			}
			
			/*Salva Atuações profissionais*/
			if(!atuaProfVazio){
				fos = new FileOutputStream(path+"_"+"atuacao_profissional.obj");
				oos = new ObjectOutputStream(fos);
				oos.writeObject(atuaProfLista);
				oos.close();
				session.removeAttribute("atuaProfLista");
				session.setAttribute("atuaProfLista", atuaProfLista);
			}else{
				File apagarArquivo = new File(path+"_"+"atuacao_profissional.obj");
		        if(apagarArquivo.exists()){  
		            apagarArquivo.delete();  
		        }  
		        session.removeAttribute("atuaProfLista");
			}
			
			/*Salva Produções bibliográficas*/
			if(!prodBiblVazio){
				fos = new FileOutputStream(path+"_"+"producao_bibliografica.obj");
				oos = new ObjectOutputStream(fos);
				oos.writeObject(prodBiblioLista);
				oos.close();
				session.removeAttribute("prodBiblioLista");
				session.setAttribute("prodBiblioLista", prodBiblioLista);
			}else{
				File apagarArquivo = new File(path+"_"+"producao_bibliografica.obj");
		        if(apagarArquivo.exists()){  
		            apagarArquivo.delete();  
		        }  
		        session.removeAttribute("prodBiblioLista");
			}
			
		} catch (Exception e){
			
		}	
		
		String url = null;
		
		url = "curriculo.jsp";
		
		response.setContentType("text/html;charset=UTF-8");  
		
		RequestDispatcher dispatcher = request.getRequestDispatcher(url);
		dispatcher.forward(request, response);
		
	}

}
